var link, jsGame; (function() {
    var g, B, C, b, e, n, h = window.eval;
    window.eval = function() {};
    window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || window.setTimeout;
    window.cancelAnimationFrame = window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || window.oCancelAnimationFrame || window.msCancelAnimationFrame || window.clearTimeout;
    String || (String = {});
    String.format || (String.format = function() {
        if (0 == arguments.length) return null;
        for (var a = arguments[0] || "", c, i = 1, v = arguments.length; i < v; i++) c = RegExp("\\{" + (i - 1) + "\\}", "gm"),
        a = a.replace(c, arguments[i]);
        return a
    });
    String.getByteLength || (String.getByteLength = function(a) {
        for (var c = 0,
        i = a || "",
        v = i.length,
        a = 0; a < v; a++) c = 0 <= i.charCodeAt(a) & 255 >= i.charCodeAt(a) ? c + 1 : c + 2;
        return c
    });
    if (!Array || !Array.prototype) Array.prototype = {};
    Array.prototype.indexOfAttr = function(a, c) {
        for (var i = (typeof a).toLowerCase(), v = -1, b = 0, d = this.length; b < d; b++) if ("string" == i && this[b][a] == c || "number" == i && this[b] == a) {
            v = b;
            break
        }
        return v
    };
    var j = "linkScreen",
    p = "12px Arial",
    s = 240,
    t = 320,
    w = [],
    E = [],
    A = "",
    D = 1,
    ha = !1,
    x = 1,
    f = {
        loadRes: null,
        pageLoad: null,
        menu: null,
        run: null,
        runFn: function() {},
        rafRun: null,
        stop: null,
        over: null,
        zone: null,
        active: null,
        lastDate: Date.now(),
        timeout: 30,
        isPause: !1,
        gameFlow: -1,
        loadedImageToGameFlow: -1,
        zoneArgs: null,
        activeArgs: null,
        spendTime: 0,
        loadResTimer: null,
        playTimer: null
    },
    d = {
        key: 0,
        keys: {
            up: !1,
            down: !1,
            left: !1,
            right: !1,
            a: !1,
            b: !1,
            c: !1,
            menu: !1,
            quit: !1
        },
        lastKey: {
            up: !1,
            down: !1,
            left: !1,
            right: !1,
            a: !1,
            b: !1,
            c: !1,
            menu: !1,
            quit: !1
        },
        pressedKey: {
            up: !1,
            down: !1,
            left: !1,
            right: !1,
            a: !1,
            b: !1,
            c: !1,
            menu: !1,
            quit: !1
        },
        keyPressCtrl: {
            up: !0,
            down: !0,
            left: !0,
            right: !0,
            a: !0,
            b: !0,
            c: !0,
            menu: !0,
            quit: !0
        },
        keyDownGo: !1,
        keyUpGo: !1,
        keyPressedGo: !1,
        keyDownCallBack: null,
        keyUpCallBack: null,
        orientationChange: null,
        touchStart: null,
        touchEnd: null,
        touchMove: null,
        touchCancel: null,
        clickCallBack: null,
        mouseDownCallBack: null,
        mouseUpCallBack: null,
        mouseMoveCallBack: null,
        focused: !1,
        pageFocusCallBack: null,
        pageUnFocusCallBack: null,
        pageOffX: 0,
        pageOffY: 0
    },
    u = {},
    F = [],
    S = {},
    K = {},
    J = 0,
    q = 0,
    L = "",
    X = !1,
    y = {},
    r = {
        xhrObj: null,
        pool: [],
        poolLength: 5,
        date: null,
        isTimeout: !1,
        param: {
            type: "get",
            data: null,
            dataType: "json",
            url: "",
            xhr: null,
            timeout: 5E3,
            before: function() {},
            success: function() {},
            error: function() {},
            complete: function() {}
        }
    },
    da = [],
    ea = {
        up: 38,
        down: 40,
        left: 37,
        right: 39,
        a: 90,
        b: 88,
        c: 67,
        menu: 49,
        quit: 50
    },
    z = {
        menu: 0,
        run: 1,
        stop: 2,
        over: 3,
        zone: 4,
        active: 5,
        loadImage: 6,
        loadedImage: 7
    },
    fa,
    l = {
        getCanvasDom: function() {
            fa || (fa = m.getDom("linkScreen"));
            return fa
        },
        getOffsetX: function(a) {
            return a.offsetX || (a.targetTouches && a.targetTouches[0] ? a.targetTouches[0].clientX - l.getCanvasDom().offsetLeft: a.clientX - l.getCanvasDom().offsetLeft) || 0
        },
        getOffsetY: function(a) {
            return a.offsetY || (a.targetTouches && a.targetTouches[0] ? a.targetTouches[0].clientY - l.getCanvasDom().offsetTop: a.clientY - l.getCanvasDom().offsetTop) || 0
        },
        keydown: function(a) {
            var c = l.checkKey(a.keyCode);
            d.keyDownGo && void 0 != d.keys[c] && (d.keys[c] = !0);
            d.keyUpGo && void 0 != d.lastKey[c] && (d.lastKey[c] = !1);
            d.keyPressCtrl[c] && d.keyPressedGo && (void 0 != d.pressedKey[c] && (d.pressedKey[c] = !0), d.keyPressCtrl[c] = !1);
            null != d.keyDownCallBack && d.keyDownCallBack(a)
        },
        keyup: function(a) {
            var c = l.checkKey(a.keyCode);
            d.keyDownGo && void 0 != d.keys[c] && (d.keys[c] = !1);
            d.keyUpGo && void 0 != d.lastKey[c] && (d.lastKey[c] = !0);
            d.keyPressedGo && (void 0 != d.pressedKey[c] && (d.pressedKey[c] = !1), d.keyPressCtrl[c] = !0);
            null != d.keyUpCallBack && d.keyUpCallBack(a)
        },
        orientationchange: function(a) {
            null != d.orientationChange && d.orientationChange(a)
        },
        touchstart: function(a) {
            d.pageOffX = l.getOffsetX(a);
            d.pageOffY = l.getOffsetY(a);
            null != d.touchStart && d.touchStart(a, d.pageOffX, d.pageOffY)
        },
        touchend: function(a) {
            a.preventDefault();
            null != d.touchEnd && d.touchEnd(a, d.pageOffX, d.pageOffY)
        },
        touchmove: function(a) {
            1 == a.touches.length && a.preventDefault();
            d.pageOffX = l.getOffsetX(a);
            d.pageOffY = l.getOffsetY(a);
            null != d.touchMove && d.touchMove(a, d.pageOffX, d.pageOffY)
        },
        touchcancel: function(a) {
            d.pageOffX = l.getOffsetX(a);
            d.pageOffY = l.getOffsetY(a);
            null != d.touchCancel && d.touchCancel(a, d.pageOffX, d.pageOffY)
        },
        click: function(a) {
            null != d.clickCallBack && d.clickCallBack(a, l.getOffsetX(a), l.getOffsetY(a))
        },
        mouseDown: function(a) {
            null != d.mouseDownCallBack && d.mouseDownCallBack(a, l.getOffsetX(a), l.getOffsetY(a))
        },
        mouseUp: function(a) {
            null != d.mouseUpCallBack && d.mouseUpCallBack(a, l.getOffsetX(a), l.getOffsetY(a))
        },
        mouseMove: function(a) {
            null != d.mouseMoveCallBack && d.mouseMoveCallBack(a, l.getOffsetX(a), l.getOffsetY(a))
        },
        pageFocus: function(a) {
            if (d.focused) return d.focused = !1;
            null != d.pageFocusCallBack && d.pageFocusCallBack(a)
        },
        pageUnFocus: function(a) {
            null != d.pageUnFocusCallBack && d.pageUnFocusCallBack(a)
        },
        checkKey: function(a) {
            var c = "0",
            i;
            for (i in ea) if (ea[i] == a) {
                c = i;
                break
            }
            return c
        },
        getDeviceConfig: function() {
            var a = navigator.userAgent.toLowerCase();
            return - 1 != a.indexOf("duopaosafari") ? {
                device: "duopaoSafari",
                fps: 1,
                touch: !0,
                zoom: 1
            }: -1 != a.indexOf("iphone") || -1 != a.indexOf("ipod") ? {
                device: "iphone",
                fps: 1,
                touch: !0,
                zoom: 1
            }: -1 != a.indexOf("ipad") ? {
                device: "ipad",
                fps: 1,
                touch: !0,
                zoom: 1
            }: -1 != a.indexOf("duopaoandroid") ? {
                device: "duopaoAndroid",
                fps: 1,
                touch: !0,
                zoom: 1
            }: -1 != a.indexOf("duopaowindowsphone") ? {
                device: "duopaoWindowsPhone",
                fps: 1,
                touch: !0,
                zoom: 1
            }: -1 != a.indexOf("opera mobi") ? {
                device: "operamobile",
                fps: 1,
                touch: !0,
                zoom: 1
            }: -1 != a.indexOf("flyflow") ? {
                device: "flyflow",
                fps: 1,
                touch: !0,
                zoom: 1
            }: -1 != a.indexOf("android") ? {
                device: "android",
                fps: 1,
                touch: !0,
                zoom: 1
            }: -1 != a.indexOf("iemobile") ? {
                device: "iemobile",
                fps: 1,
                touch: !1,
                zoom: 1
            }: -1 != a.indexOf("j2me") ? {
                device: "j2me",
                fps: 1,
                touch: !1,
                zoom: 1
            }: -1 != a.indexOf("symbian v5") ? {
                device: "symbian5",
                fps: 1,
                touch: !0,
                zoom: 1
            }: -1 != a.indexOf("symbian v3") ? {
                device: "symbian3",
                fps: 1,
                touch: !1,
                zoom: 1
            }: -1 != a.indexOf("chrome") ? {
                device: "chrome",
                fps: 1,
                touch: !1,
                zoom: 1
            }: -1 != a.indexOf("firefox") ? {
                device: "firefox",
                fps: 1,
                touch: !1,
                zoom: 1
            }: -1 != a.indexOf("msie") ? {
                device: "ie",
                fps: 0.5,
                touch: !1,
                zoom: 1
            }: -1 != a.indexOf("windows") ? {
                device: "ie",
                fps: 0.5,
                touch: !1,
                zoom: 1
            }: -1 != a.indexOf("safari") ? {
                device: "safari",
                fps: 1,
                touch: !1,
                zoom: 1
            }: -1 != a.indexOf("opera") ? {
                device: "opera",
                fps: 1,
                touch: !1,
                zoom: 1
            }: {
                device: "",
                fps: 1,
                touch: !1,
                zoom: 1
            }
        },
        setImage: function(a, c, i, v, b) {
            if (!a || !c) return ! 1;
            u[a] || (u[a] = new Image, u[a].onload = function() {
                q++;
                this.loaded = !0;
                this.cache && m.canvas.pass(this.id, this.width, this.height).drawImage(this.id, 0, 0).pass().base().delImage(this.id, !0)
            },
            u[a].src = c + ("" != L ? "?v=" + L: ""), u[a].id = a, u[a].url = c, u[a].benchId = i, u[a].bench = v, u[a].cache = b, u[a].refreshed = !1)
        },
        setAudio: function(a, c, i, v, b, d) {
            if (!a || !c) return ! 1;
            y[a] || (c = new Audio(c + ("" != L ? "?v=" + L: "")), c.id = a, c.autoplay = v, c.preload = b, c.autobuffer = d, c.loop = i, y[c.id] = c)
        },
        loadingCallBack: function(a, c, i) {
            var v = m.canvas.screen.getWidth(),
            b = m.canvas.screen.getHeight(),
            d = parseInt(v - v >> 1),
            e = b - 5,
            a = a > c ? c: a,
            ia = parseInt(100 * (a / c)) + "%";
            m.canvas.fillStyle("#000").fillRect(0, 0, v, b).fillStyle("#00FFFF").fillRect(d, e, parseInt(a / c * v), 5).fillStyle("#FFF").fillText("loading " + i, 5, b - 10).fillText(ia, v - m.canvas.measureText(ia).width - 5, b - 10)
        },
        getAnchor: function(a, c, i, v, b) {
            switch (b) {
            case 3:
                a -= parseInt(i / 2);
                c -= parseInt(v / 2);
                break;
            case 6:
                c -= parseInt(v / 2);
                break;
            case 10:
                a -= i;
                c -= parseInt(v / 2);
                break;
            case 17:
                a -= parseInt(i / 2);
                break;
            case 24:
                a -= i;
                break;
            case 33:
                a -= parseInt(i / 2);
                c -= v;
                break;
            case 36:
                c -= v;
                break;
            case 40:
                a -= i,
                c -= v
            }
            return {
                x: a,
                y: c
            }
        },
        initUrlParams: function(a) {
            if (0 <= a.indexOf("?")) {
                var c = a.split("?"),
                a = [];
                0 <= c[1].indexOf("&") ? a = c[1].split("&") : a.push(c[1]);
                for (var c = [], i = 0; i < a.length; i++) 0 <= a[i].indexOf("=") && (c = a[i].split("="), da[c[0]] = c[1])
            }
        },
        audioEnded: function() {
            m.audio.replay(this.id)
        },
        pageLoaded: function() {
            X = !0;
            f.pageLoad(m)
        }
    },
    k,
    G,
    P,
    Q,
    H,
    T,
    R,
    U,
    Y = [],
    ja = 0,
    Z = 0,
    V,
    M,
    W,
    N,
    m = jsGame = link = {
        init: function(a, c) { ! a && !c ? (this.version = 1, this.request.init(), this.canvas.initDevice(), this.localStorage.init(), this.sessionStorage.init()) : (s = a, t = c);
            return this
        },
        extend: function(a, c, i) {
            i = i || {};
            if (c) {
                var b = function() {};
                b.prototype = c.prototype;
                a.prototype = new b;
                a.prototype.constructor = a;
                a.prototype.superClass = c.prototype;
                b = null
            }
            for (var d in i) a.prototype[d] = i[d];
            i = null;
            return a
        },
        setAjax: function(a) {
            r.param = this.objExtend(r.param, a || {});
            return this
        },
        ajax: function(a) {
            a && r.pool.length < r.poolLength && r.pool.push(a);
            a && a.clear && (r.pool = []);
            r.xhr || (r.xhr = new XMLHttpRequest, r.xhr.onreadystatechange = function() {
                if (r.isTimeout) return ! 1;
                var a = r.xhr,
                c = r.xhrObj;
                if (c && 4 == a.readyState) {
                    r.date && (clearTimeout(r.date), r.date = null);
                    if (200 == a.status) {
                        switch (c.dataType) {
                        case "HTML":
                        case "SCRIPT":
                        case "XML":
                            a = a.responseText;
                            break;
                        default:
                            a = a.responseText.replace(/<[^>].*?>/g, "");
                            break;
                        case "JSON":
                            a = m.getJson(a.responseText)
                        }
                        c.success(a, c);
                        c.complete(c)
                    } else c.error(c, "error");
                    r.xhrObj = null;
                    m.ajax()
                }
            });
            if (null == r.xhrObj && 0 < r.pool.length) {
                r.xhrObj = this.objExtend(r.param, r.pool.shift() || {});
                var a = r.xhr,
                c = r.xhrObj,
                i = r.xhrObj.url,
                b = null,
                d = c.data;
                c.type = c.type.toUpperCase();
                c.dataType = c.dataType.toUpperCase();
                r.isTimeout = !1;
                if ("string" == typeof d) b = d;
                else if ("object" == typeof d) {
                    var b = [],
                    e;
                    for (e in d) b.push(e + "=" + d[e]);
                    b = b.join("&")
                }
                "GET" == c.type && (i += "?" + b);
                a.open(c.type, i, !0);
                c.before(r.xhrObj);
                "POST" == c.type && a.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
                a.send(b);
                a = c = b = d = i = null;
                r.date = setTimeout(function() {
                    m.ajax({
                        clear: !0
                    });
                    r.isTimeout = !0;
                    r.xhrObj && (r.xhrObj.error(r.xhrObj, "timeout"), r.xhrObj = null)
                },
                r.xhrObj.timeout)
            }
            return this
        },
        getDom: function(a) {
            try {
                return document.getElementById(a)
            } catch(c) {
                return document.all[a]
            }
        },
        objExtend: function() {
            var a = this.clone(arguments[0]) || {},
            c = 1,
            i = arguments.length,
            b = !1,
            d;
            "boolean" === typeof a && (b = a, a = arguments[1] || {},
            c = 2);
            "object" !== typeof a && (a = {});
            i == c && (a = this, --c);
            if (!arguments[1]) return a;
            for (; c < i; c++) if (null != (d = arguments[c])) for (var e in d) {
                var h = a[e],
                g = d[e];
                a !== g && (b && g && "object" === typeof g && !g.nodeType ? a[e] = this.objExtend(b, h || (null != g.length ? [] : {}), g) : void 0 !== g && (a[e] = g))
            }
            return a
        },
        getJson: function(a) {
            var c = {};
            try {
                c = window.JSON ? JSON.parse(a) : h("(" + a + ")")
            } catch(i) {}
            return c
        },
        clone: function(a) {
            var c = a || [];
            if ("object" == typeof c) if (void 0 != c.length) for (var a = [], i = 0, b = c.length; i < b; i++) void 0 !== c[i] && (a[i] = null != c[i] && "object" == typeof c[i] ? void 0 != c[i].length ? c[i].slice(0) : c[i] : c[i]);
            else for (i in a = {},
            c) void 0 !== c[i] && (a[i] = null != c[i] && "object" == typeof c[i] ? void 0 != c[i].length ? c[i].slice(0) : c[i] : c[i]);
            return a
        },
        classes: {},
        comm: {
            registerNotify: function(a, c) {
                null != a && a.register(c)
            },
            rangeRegisterNotify: function(a, c) {
                for (var i = 0; i < c.length; i++) m.commandFuns.registerNotify(a, c[i])
            },
            unRegisterNotify: function(a, c) {
                null != a && a.unregister(c)
            },
            rangeUnRegisterNotify: function(a, c) {
                for (var i = 0; i < c.length; i++) m.commandFuns.unRegisterNotify(a, c[i])
            },
            getRandom: function(a, c) {
                if (c) return Math.round(Math.random() * (c - a) + a);
                var i = a;
                if (!i || 0 > i) i = 0;
                return Math.round(Math.random() * i)
            },
            getArray: function(a, c) {
                Y = [];
                ja = a.toString().length;
                Z = a;
                for (var i = 0; i < ja; i++) Y.push(Z % 10),
                Z = parseInt(Z / 10);
                c || Y.reverse();
                return Y
            },
            inArray: function(a, c) {
                var i, b = c.length;
                for (i = 0; i < b; i++) if (a == c[i]) return i;
                return - 1
            },
            collision: function(a, c, i, b, d, e, g, h) {
                return g && Math.abs(a + parseInt(i / 2) - (d + parseInt(g / 2))) < parseInt((i + g) / 2) && Math.abs(c + parseInt(b / 2) - (e + parseInt(h / 2))) < parseInt((b + h) / 2) ? !0 : !1
            },
            circleCollision: function(a, c, i, b, d, e) {
                a = Math.abs(a - b);
                c = Math.abs(c - d);
                return Math.sqrt(a * a + c * c) < i + e ? !0 : !1
            },
            createPath: function(a, c, i, b, d) {
                for (var e = [], a = (i || 0) - (a || 0), g = (b || 0) - (c || 0), c = Math.sqrt(Math.pow(a, 2) + Math.pow(g, 2)), b = d = d || 5, h = i = 0, f = 180 * (Math.atan2(g, a) / Math.PI), f = 0 <= f ? f: f + 360; b < c + d;) b = b > c ? c: b,
                a = b * Math.cos(f / 180 * Math.PI),
                g = b * Math.sin(f / 180 * Math.PI),
                e.unshift([a - i, g - h]),
                i = a,
                h = g,
                b += d;
                return e
            }
        },
        localStorage: {
            init: function() {
                V = this;
                if (!M) {
                    var a;
                    try {
                        a = window.localStorage,
                        a.getItem || (a.getItem = function() {
                            return null
                        }),
                        a.setItem || (a.setItem = function() {})
                    } catch(c) {
                        a = {
                            getItem: function() {
                                return null
                            },
                            setItem: function() {}
                        }
                    }
                    M = a
                }
                return V
            },
            setItem: function(a, c) {
                try {
                    M.setItem(a, c)
                } catch(i) {}
                return V
            },
            getItem: function(a) {
                return M.getItem(a)
            },
            removeItem: function(a) {
                M.removeItem(a);
                return V
            },
            clear: function() {
                M.clear();
                return V
            },
            key: function(a) {
                return M.key(a)
            },
            getLength: function() {
                return M.length
            },
            base: function() {
                return m
            }
        },
        sessionStorage: {
            init: function() {
                W = this;
                if (!N) {
                    var a;
                    try {
                        a = window.sessionStorage,
                        a.getItem || (a.getItem = function() {
                            return null
                        }),
                        a.setItem || (a.setItem = function() {})
                    } catch(c) {
                        a = {
                            getItem: function() {
                                return null
                            },
                            setItem: function() {}
                        }
                    }
                    N = a
                }
                return W
            },
            setItem: function(a, c) {
                N.setItem(a, c);
                return W
            },
            getItem: function(a) {
                return N.getItem(a)
            },
            removeItem: function(a) {
                N.removeItem(a);
                return W
            },
            clear: function() {
                N.clear();
                return W
            },
            key: function(a) {
                return N.key(a)
            },
            getLength: function() {
                return N.length
            },
            base: function() {
                return m
            }
        },
        pageLoad: function(a) {
            null == f.pageLoad && (f.pageLoad = a, window.addEventListener("load",
            function() {
                m.canvas.init();
                m.graphics.ANCHOR_LT = 20;
                m.graphics.ANCHOR_LV = 6;
                m.graphics.ANCHOR_LB = 36;
                m.graphics.ANCHOR_HT = 17;
                m.graphics.ANCHOR_HV = 3;
                m.graphics.ANCHOR_HB = 33;
                m.graphics.ANCHOR_RT = 24;
                m.graphics.ANCHOR_RV = 10;
                m.graphics.ANCHOR_RB = 40;
                var a = m.getDom("linkScreen");
                a && (m.canvas.screen.getTouch() ? (window.addEventListener("orientationchange", l.orientationchange, !1), a.addEventListener("touchstart", l.touchstart, !1), a.addEventListener("touchend", l.touchend, !1), a.addEventListener("touchmove", l.touchmove, !1), a.addEventListener("touchcancel", l.touchcancel, !1)) : (document.onkeydown = l.keydown, document.onkeyup = l.keyup, a.addEventListener("click", l.click, !1), a.addEventListener("mousedown", l.mouseDown, !1), a.addEventListener("mouseup", l.mouseUp, !1), a.addEventListener("mousemove", l.mouseMove, !1)));
                a = m.canvas.screen.getDevice();
                "ipad" == a || "iphone" == a ? (d.focused = !0, window.addEventListener("pageshow", l.pageFocus, !1), window.addEventListener("pagehide", l.pageUnFocus, !1)) : ("firefox" == a && (d.focused = !0), window.addEventListener("focus", l.pageFocus, !1), window.addEventListener("blur", l.pageUnFocus, !1));
                m.canvas.fillStyle("#000").fillRect(0, 0, m.canvas.screen.getWidth(), m.canvas.screen.getHeight());
                X = !1;
                m.gameFlow.run().base().play();
                0 < F.length ? m.loadImage(F) : l.pageLoaded()
            },
            !1));
            return m
        },
        menu: function(a) {
            "function" == typeof a && (f.menu = a);
            return this
        },
        run: function(a) {
            "function" == typeof a && (f.runFn = a);
            return this
        },
        stop: function(a) {
            "function" == typeof a && (f.stop = a);
            return this
        },
        over: function(a) {
            "function" == typeof a && (f.over = a);
            return this
        },
        zone: function(a) {
            "function" == typeof a && (f.zone = a);
            return this
        },
        active: function(a) {
            "function" == typeof a && (f.active = a);
            return this
        },
        play: function() {
            f.run || (f.run = function() {
                var a = Date.now();
                switch (f.gameFlow) {
                case z.menu:
                    f.menu();
                    break;
                case z.run:
                    f.runFn();
                    break;
                case z.stop:
                    f.stop();
                    break;
                case z.over:
                    f.over();
                    break;
                case z.zone:
                    f.zone(f.zoneArgs);
                    break;
                case z.active:
                    f.active(f.activeArgs);
                    break;
                case z.loadImage:
                    if (null != l.loadingCallBack) {
                        var c = J,
                        i = q > c ? c: q;
                        i == c && (f.gameFlow = z.loadedImage);
                        0 < c && l.loadingCallBack(i, c, "image")
                    }
                    break;
                case z.loadedImage:
                    f.gameFlow = f.loadedImageToGameFlow,
                    F = [],
                    q = 0,
                    X || l.pageLoaded()
                }
                f.spendTime = Date.now() - a
            });
            f.playTimer || (f.isPause = !1, (f.rafRun = function() {
                var a = Date.now();
                a - f.lastDate >= f.timeout - f.spendTime && (f.lastDate = a, f.isPause || f.run());
                f.rafRun && (f.playTimer = requestAnimationFrame(f.rafRun))
            })());
            return this
        },
        pause: function() {
            f.playTimer && (f.isPause = !0, f.rafRun = null, cancelAnimationFrame(f.playTimer), f.playTimer = null);
            return this
        },
        gameFlow: {
            menu: function() {
                null != f.menu && (f.gameFlow = z.menu, m.resetKeys());
                return this
            },
            run: function() {
                null != f.runFn && (f.gameFlow = z.run, m.resetKeys());
                return this
            },
            stop: function() {
                null != f.stop && (f.gameFlow = z.stop, m.resetKeys());
                return this
            },
            over: function() {
                null != f.over && (f.gameFlow = z.over, m.resetKeys());
                return this
            },
            zone: function(a) {
                null != f.zone && (f.gameFlow = z.zone, f.zoneArgs = a, m.resetKeys());
                return this
            },
            active: function(a) {
                null != f.active && (f.gameFlow = z.active, f.activeArgs = a, m.resetKeys());
                return this
            },
            isIn: function(a) {
                return f.gameFlow == z[a]
            },
            base: function() {
                return m
            }
        },
        keyRepeated: function(a) {
            d.keyDownGo || (d.keyDownGo = !0);
            return d.keys[a]
        },
        keyPressed: function(a) {
            d.keyPressedGo || (d.keyPressedGo = !0);
            var c = d.pressedKey[a];
            d.pressedKey[a] = !1;
            return c
        },
        keyReleased: function(a) {
            d.keyUpGo || (d.keyUpGo = !0);
            var c = d.lastKey[a];
            d.lastKey[a] = !1;
            return c
        },
        setKeyCode: function(a, c) {
            d.keys[a] = !1;
            d.lastKey[a] = !1;
            d.pressedKey[a] = !1;
            d.keyPressCtrl[a] = !0;
            ea[a] = c;
            return this
        },
        resetKeys: function() {
            for (var a in d.keys) d.keys[a] = !1;
            for (a in d.lastKey) d.lastKey[a] = !1;
            for (a in d.pressedKey) d.pressedKey[a] = !1;
            for (a in d.keyPressCtrl) d.keyPressCtrl[a] = !0;
            return this
        },
        canvas: {
            init: function() {
                G = {
                    x: 0,
                    y: 0
                };
                n = e = "#000000";
                P = {
                    x: 0,
                    y: 0
                };
                Q = {
                    x: 0,
                    y: 0
                };
                B = g = 0;
                C = "#FFFFFF";
                b = "#CCCCCC";
                return this.pass()
            },
            initDevice: function() {
                T = l.getDeviceConfig();
                A = T.device;
                D = T.fps;
                ha = T.touch;
                x = T.zoom;
                return this
            },
            pass: function(a, c, i) {
                var b, a = !a || "" == a ? "linkScreen": a;
                E[a] || (b = this.base().getDom(a) || document.createElement("canvas"), E[a] = null, delete E[a], E[a] = b.getContext("2d"), b.width = c ? c: s, b.style.width = parseInt(b.width * x) + "px", b.height = i ? i: t, b.style.height = parseInt(b.height * x) + "px", w[a] = null, delete w[a], w[a] = b);
                k = E[a];
                k.font = p;
                H = w[a];
                R = parseInt(H.width);
                U = parseInt(H.height);
                this.screen.setId(a);
                return this
            },
            font: function(a) {
                p = a;
                k.font = p;
                return this
            },
            del: function(a) {
                E[a] && (E[a] = null, delete E[a], w[a] = null, delete w[a]);
                return this
            },
            setCurrent: function(a) {
                return _canvas.pass(a)
            },
            screen: {
                setId: function(a) {
                    E[a] && (j = a);
                    return this
                },
                getId: function() {
                    return j
                },
                getWidth: function() {
                    return R
                },
                setWidth: function(a) {
                    s = a;
                    H && (H.width = s, H.style.width = H.width + "px", R = parseInt(H.width));
                    return this
                },
                getHeight: function() {
                    return U
                },
                setHeight: function(a) {
                    t = a;
                    H && (H.height = t, H.style.height = H.height + "px", U = parseInt(H.height));
                    return this
                },
                getDevice: function() {
                    return A
                },
                getFps: function() {
                    return D
                },
                setFps: function(a) {
                    0 < a && (D = a);
                    return this
                },
                getTouch: function() {
                    return ha
                },
                getZoom: function() {
                    return x
                }
            },
            fillStyle: function(a) {
                k.fillStyle = a;
                return this
            },
            fillRect: function(a, c, i, b, d) {
                i = i ? i: 0;
                b = b ? b: 0;
                d ? Q = l.getAnchor(a, c, i, b, d) : (Q.x = a, Q.y = c);
                k.fillRect(Q.x, Q.y, i, b);
                return this
            },
            fillText: function(a, c, i, b) {
                k.font = b || p;
                k.fillText(a, c, i);
                return this
            },
            clearRect: function(a, c, i, b) {
                k.clearRect(a, c, i, b);
                return this
            },
            clearScreen: function() {
                return this.clearRect(0, 0, R, U)
            },
            fillScreen: function() {
                return this.fillRect(0, 0, R, U)
            },
            strokeStyle: function(a) {
                k.strokeStyle = a;
                return this
            },
            lineWidth: function(a) {
                k.lineWidth = a || 1;
                return this
            },
            strokeRect: function(a, c, i, b, d) {
                d ? P = l.getAnchor(a, c, i, b, d) : (P.x = a, P.y = c);
                k.strokeRect(P.x, P.y, i, b);
                return this
            },
            strokeText: function(a, c, i, b) {
                k.font = b || p;
                k.strokeText(a, c, i);
                return this
            },
            setColor: function(a, c, i) {
                null == i ? (e = a, n = c ? c: a) : n = e = "rgb(" + a + ", " + c + ", " + i + ")";
                return this.fillStyle(e).strokeStyle(n)
            },
            drawImage: function(a, c, i, b, d, e, g, h, f, q) {
                var j = m.getImage(a);
                if (j.refreshed) this.drawCache(a, c, i, b, d, e, g, h, f, q);
                else if (null != j.src) null != h && (c = 0 > c ? 0 : c, h = 0 >= h ? 0.1 : h),
                null != f && (i = 0 > i ? 0 : i, f = 0 >= f ? 0.1 : f),
                null != b && null != h && (b = 0 >= b ? 0.1 : c + b <= j.width ? b: j.width - c),
                null != d && null != f && (d = 0 >= d ? 0.1 : i + d <= j.height ? d: j.height - i),
                j.loaded && (b ? d ? q ? (G = l.getAnchor(e, g, h, f, q), k.drawImage(j, c, i, b, d, G.x, G.y, h, f)) : k.drawImage(j, c, i, b, d, e, g, h, f) : (G = l.getAnchor(c, i, j.width, j.height, b), k.drawImage(j, G.x, G.y)) : k.drawImage(j, c, i));
                else if ((a = K[a]) && !a.inited) l.setImage(a.id, a.src, a.benchId, a.bench, a.cache),
                a.inited = !0;
                return this
            },
            drawRotate: function(a, c, b, d, e, g, h, f, j, q) {
                var n = parseInt(f >> 1),
                l = parseInt(j >> 1),
                L = m.getImage(a),
                a = L ? L: w[a],
                g = g - n,
                h = h - l;
                k.save();
                k.translate(g + n, h + l);
                k.rotate(q * Math.PI / 180);
                k.translate( - (g + n), -(h + l));
                k.drawImage(a, c, b, d, e, g, h, f, j);
                k.restore();
                return this
            },
            drawCache: function(a, c, b, d, e, g, h, f, j, q) {
                if (a = w[a]) null != f && (c = 0 > c ? 0 : c, f = 0 >= f ? 0.1 : f),
                null != j && (b = 0 > b ? 0 : b, j = 0 >= j ? 0.1 : j),
                null != d && null != f && (d = 0 >= d ? 0.1 : c + d <= a.width ? d: a.width - c),
                null != e && null != j && (e = 0 >= e ? 0.1 : b + e <= a.height ? e: a.height - b),
                d ? e ? q ? (G = l.getAnchor(g, h, f, j, q), k.drawImage(a, c, b, d, e, G.x, G.y, f, j)) : k.drawImage(a, c, b, d, e, g, h, f, j) : (G = l.getAnchor(c, b, a.width, a.height, d), k.drawImage(a, G.x, G.y)) : k.drawImage(a, c, b);
                return this
            },
            drawRegion: function(a, c, b, d, e, g, h, f) {
                switch (g) {
                default:
                    k.transform(1, 0, 0, 1, h, f);
                    break;
                case 5:
                    k.transform(0, 1, -1, 0, e + h, f);
                    break;
                case 3:
                    k.transform( - 1, 0, 0, -1, d + h, e + f);
                    break;
                case 6:
                    k.transform(0, -1, 1, 0, h, d + f);
                    break;
                case 2:
                    k.transform( - 1, 0, 0, 1, d + h, f);
                    break;
                case 7:
                    k.transform(0, -1, -1, 0, e + h, d + f);
                    break;
                case 1:
                    k.transform(1, 0, 0, -1, h, e + f);
                    break;
                case 4:
                    k.transform(0, 1, 1, 0, h, f)
                } (!m.getImage(a).cache ? this.drawImage: this.drawCache)(a, c, b, d, e, 0, 0, d, e);
                k.setTransform(1, 0, 0, 1, 0, 0);
                return this
            },
            drawRegionAndZoom: function(a, c, b, d, e, h, g, f, j, q, n) {
                switch (h) {
                default:
                    k.transform(1, 0, 0, 1, g, f);
                    break;
                case 5:
                    k.transform(0, 1, -1, 0, n + g, f);
                    break;
                case 3:
                    k.transform( - 1, 0, 0, -1, q + g, n + f);
                    break;
                case 6:
                    k.transform(0, -1, 1, 0, g, q + f);
                    break;
                case 2:
                    k.transform( - 1, 0, 0, 1, q + g, f);
                    break;
                case 7:
                    k.transform(0, -1, -1, 0, n + g, q + f);
                    break;
                case 1:
                    k.transform(1, 0, 0, -1, g, n + f);
                    break;
                case 4:
                    k.transform(0, 1, 1, 0, g, f)
                } (!m.getImage(a).cache ? this.drawImage: this.drawCache)(a, c, b, d, e, 0, 0, q, n);
                k.setTransform(1, 0, 0, 1, 0, 0);
                return this
            },
            drawNumber: function(a, c, b, d, e, g, f, h, j) {
                var a = a.toString(),
                q = a.length,
                h = h ? h: b,
                j = j ? j: d;
                if ("center" == f) {
                    e += parseInt(R - h * q >> 1);
                    for (f = 0; f < q; f++) this.drawImage(c, parseInt(a.charAt(f)) * b, 0, b, d, e + f * h, g, h, j)
                } else if (!0 == f) for (f = 0; f < q; f++) this.drawImage(c, parseInt(a.charAt(f)) * b, 0, b, d, e + f * h, g, h, j);
                else if (!1 == f) for (f = q - 1; 0 <= f; f--) this.drawImage(c, parseInt(a.charAt(f)) * b, 0, b, d, e - (q - 1 - f) * h, g, h, j, m.graphics.ANCHOR_RT);
                return this
            },
            moveTo: function(a, c) {
                k.moveTo(a, c);
                return this
            },
            lineTo: function(a, c) {
                k.lineTo(a, c);
                return this
            },
            stroke: function() {
                k.stroke();
                return this
            },
            fill: function() {
                k.fill();
                return this
            },
            beginPath: function() {
                k.beginPath();
                return this
            },
            closePath: function() {
                k.closePath();
                return this
            },
            arc: function(a, c, b, d, e, f) {
                k.arc(a, c, b, d, e, f);
                return this
            },
            quadraticCurveTo: function(a, c, b, d) {
                k.quadraticCurveTo(a, c, b, d);
                return this
            },
            bezierCurveTo: function(a, c, b, d, e, f) {
                k.bezierCurveTo(a, c, b, d, e, f);
                return this
            },
            measureText: function(a) {
                var c = k.measureText(a),
                b = c.width,
                c = c.height ? c.height: parseInt(k.font);
                return {
                    width: "j2me" == this.screen.getDevice() ? k.measureText(a) : b,
                    height: c
                }
            },
            translate: function(a, c) {
                k.translate(a, c);
                return this
            },
            drawLine: function(a, c, b, d) {
                return this.beginPath().moveTo(a, c).lineTo(b, d).closePath().stroke()
            },
            drawRect: function(a, c, b, d, e) {
                return this.strokeRect(a, c, b, d, e)
            },
            drawString: function(a, c, d, e, f, h, j, q) {
                g = c;
                B = d;
                k.font = q || p;
                if (e) switch (e) {
                case 4:
                    g = 0;
                    break;
                case 2:
                    g = parseInt(this.screen.getWidth() - this.measureText(a).width >> 1);
                    break;
                case 8:
                    g = this.screen.getWidth() - this.measureText(a).width
                }
                f && (C = h ? h: "#000000", b = j ? j: "#CCCCCC", this.fillStyle(b).fillText(a, g + 1, B + 1, q).fillStyle(C));
                return this.fillText(a, g, B, q).fillStyle("rgb(0, 0, 0)")
            },
            drawSubstring: function(a, c, b, d, e, f, h, g, j, q) {
                return this.drawString(a.substring(c, c + b), d, e, f, h, g, j, q)
            },
            clip: function() {
                k.clip();
                return this
            },
            save: function() {
                k.save();
                return this
            },
            restore: function() {
                k.restore();
                return this
            },
            rect: function(a, c, b, d) {
                k.rect(a, c, b, d);
                return this
            },
            rotate: function(a) {
                k.rotate(a);
                return this
            },
            setTransform: function(a, c, b, d, e, f) {
                k.setTransform(a, c, b, d, e, f);
                return this
            },
            scale: function(a, c) {
                k.scale(a, c);
                return this
            },
            globalAlpha: function(a) {
                k.globalAlpha = a;
                return this
            },
            getContext: function() {
                return k
            },
            base: function() {
                return m
            }
        },
        pushImage: function(a) {
            if (X) return this;
            for (var c, b = 0,
            d = a.length; b < d; b++) if ((c = a[b]) && !S[c.id]) S[c.id] = !0,
            F.push(a[b]);
            return this
        },
        loadImage: function(a) {
            if (f.gameFlow != z.loadImage && 0 < a.length) {
                f.loadedImageToGameFlow = f.gameFlow;
                f.gameFlow = z.loadImage;
                F = a;
                J = F.length;
                for (var a = q = 0,
                c; c = F[a]; a++) u[c.id] ? q++:l.setImage(c.id, c.src, c.benchId)
            }
            return this
        },
        asyncImage: function(a) {
            for (var c, b = 0,
            d = a.length; b < d; b++) c = a[b] || {},
            K[c.id] || (K[c.id] = c);
            return this
        },
        verImage: function(a) {
            "" == L && (L = a);
            return this
        },
        loadingCallBack: function(a) {
            "function" == typeof a && (l.loadingCallBack = a);
            return this
        },
        addImage: function(a, c) {
            a && (c && !u[a]) && (u[a] = c);
            return this
        },
        getImage: function(a) {
            return u[a] ? u[a] : {
                src: null
            }
        },
        delImage: function(a, c) {
            u[a] && (u[a] = null, delete u[a], c && (u[a] = {
                id: a,
                loaded: !0,
                cache: !0,
                refreshed: !0
            }));
            return this
        },
        getAsyncImage: function(a) {
            return K[a] ? K[a] : {
                src: null
            }
        },
        clearAsyncImageCache: function() {
            try {
                var a, c, b;
                for (b in u) if (a = u[b]) if (c = K[b]) c.inited = !1,
                this.delImage(b).canvas.del(b)
            } catch(d) {}
            return this
        },
        audio: {
            play: function(a) {
                var c = y[a];
                if (c) try {
                    c.currentTime >= c.duration ? this.replay(a) : c.paused && c.play()
                } catch(b) {}
                return this
            },
            playRange: function(a, c, b) {
                if (a = y[a]) try {
                    a.__timeupdateCallBack__ || a.addEventListener("timeupdate", a.__timeupdateCallBack__ = function() {
                        this.currentTime >= this.__to__ && (this.loop ? this.currentTime = this.__from__: this.pause())
                    },
                    !1),
                    a.__from__ = null == c ? 0 : c,
                    a.__to__ = null == b ? a.duration: b,
                    this.setCurrentTime(a.id, a.__from__).play(a.id)
                } catch(d) {}
                a = null;
                return this
            },
            pause: function(a) {
                if (y[a]) try {
                    y[a].pause()
                } catch(c) {}
                return this
            },
            pauseAll: function() {
                for (var a in y) this.pause(a);
                return this
            },
            mute: function(a, c) {
                if (y[a]) try {
                    y[a].muted = c
                } catch(b) {}
            },
            vol: function(a, c) {
                if (y[a]) try {
                    y[a].volume = c
                } catch(b) {}
                return this
            },
            loop: function(a, c) {
                if (y[a]) try {
                    y[a].loop = c
                } catch(b) {}
                return this
            },
            replay: function(a) {
                this.setCurrentTime(a, 0).play(a);
                return this
            },
            setCurrentTime: function(a, c) {
                var b = y[a];
                if (b) try {
                    0 > c ? c = 0 : c > b.duration && (c = b.duration),
                    b.currentTime = c || 0
                } catch(d) {}
                return this
            },
            getAudio: function(a) {
                return y[a]
            },
            del: function(a) {
                var c = y[a];
                c && c.__timeupdateCallBack__ && (c.pause(), c.removeEventListener("timeupdate", c.__timeupdateCallBack__, !1), y[a] = null, delete y[a]);
                return this
            },
            base: function() {
                return m
            }
        },
        initAudio: function(a) {
            if (!window.Audio) return this;
            if (0 < a.length) {
                y = {};
                for (var c, b = 0; b < a.length; b++)(c = a[b]) && l.setAudio(c.id, c.src, c.loop, c.autoplay, c.preload, c.autobuffer)
            }
            return this
        },
        setRunFrequency: function(a) {
            f.timeout = a;
            return this
        },
        events: {
            keyDown: function(a) {
                d.keyDownGo || (d.keyDownGo = !0);
                d.keyUpGo || (d.keyUpGo = !0);
                d.keyPressedGo || (d.keyPressedGo = !0);
                d.keyDownCallBack = a;
                return this
            },
            keyUp: function(a) {
                d.keyDownGo || (d.keyDownGo = !0);
                d.keyUpGo || (d.keyUpGo = !0);
                d.keyPressedGo || (d.keyPressedGo = !0);
                d.keyUpCallBack = a;
                return this
            },
            orientationChange: function(a) {
                d.orientationChange = a;
                return this
            },
            touchStart: function(a) {
                d.touchStart = a;
                return this
            },
            touchEnd: function(a) {
                d.touchEnd = a;
                return this
            },
            touchMove: function(a) {
                d.touchMove = a;
                return this
            },
            touchCancel: function(a) {
                d.touchCancel = a;
                return this
            },
            click: function(a) {
                d.clickCallBack = a;
                return this
            },
            mouseDown: function(a) {
                d.mouseDownCallBack = a;
                return this
            },
            mouseUp: function(a) {
                d.mouseUpCallBack = a;
                return this
            },
            mouseMove: function(a) {
                d.mouseMoveCallBack = a;
                return this
            },
            createEvent: function(a, c) {
                var b = document.getElementById(a);
                if (b) {
                    var d = document.createEvent("HTMLEvents");
                    d.initEvent(c, !1, !0);
                    b.dispatchEvent(d)
                }
            },
            pageFocus: function(a) {
                d.pageFocusCallBack = a;
                return this
            },
            pageUnFocus: function(a) {
                d.pageUnFocusCallBack = a;
                return this
            },
            base: function() {
                return m
            }
        },
        ui: {},
        graphics: {
            HCENTER: 1,
            VCENTER: 2,
            LEFT: 4,
            RIGHT: 8,
            TOP: 16,
            BOTTOM: 32
        },
        trans: {
            TRANS_NONE: 0,
            TRANS_ROT90: 5,
            TRANS_ROT180: 3,
            TRANS_ROT270: 6,
            TRANS_MIRROR: 2,
            TRANS_MIRROR_ROT90: 7,
            TRANS_MIRROR_ROT180: 1,
            TRANS_MIRROR_ROT270: 4
        },
        request: {
            init: function() {
                l.initUrlParams(window.leiyooHref ? window.leiyooHref: location.href)
            },
            get: function(a) {
                return da[a] ? da[a] : ""
            }
        }
    }.init(),
    $ = document.getElementsByTagName("head")[0],
    I = null,
    aa = null,
    ba = null,
    ca = null,
    ga = function() {
        aa && (clearTimeout(aa), aa = null)
    };
    link.getScript = function(a) {
        if (!$ || I) return ! 1;
        a = m.objExtend({
            url: "",
            before: function() {},
            success: function() {},
            error: function() {},
            timeout: 5E3,
            contentType: "text/javascript",
            destroyed: !0
        },
        a || {});
        "" != a.url && (a.before(), I = document.createElement("script"), I.type = a.contentType, I.async = !0, I.src = a.url, I.destroyed = a.destroyed, ba = a.success, ca = a.error, I.onload = function() {
            ga();
            ba && (ba(), ba = null);
            this.destroyed && $.removeChild(this);
            I = null
        },
        $.appendChild(I), ga(), aa = setTimeout(function() {
            ga();
            ca && (ca("timeout"), ca = null);
            I && I.destroyed && $.removeChild(I);
            I = null
        },
        a.timeout));
        a = null;
        return m
    };
    var O = function() {
        return (65536 * (1 + Math.random()) | 0).toString(16).substring(1)
    };
    link.getNewGuid = function() {
        return O() + O() + "-" + O() + "-" + O() + "-" + O() + "-" + O() + O() + O()
    };
    link.classes.Observer = function() {
        this.group = []
    };
    link.classes.Observer.prototype.register = function(a) {
        if (null == a) return this; - 1 == m.comm.inArray(a, this.group) && this.group.push(a);
        return this
    };
    link.classes.Observer.prototype.unregister = function(a) {
        if (null == a) return this;
        a = m.commandFuns.inArray(a, this.group); - 1 < a && this.group.splice(a, 1);
        return this
    };
    link.classes.Observer.prototype.notify = function(a) {
        for (var c = 0; c < this.group.length; c++) if (null != this.group[c]) this.group[c](a);
        return this
    };
    link.classes.Observer.prototype.clear = function() {
        0 < this.group.length && this.group.splice(0, this.group.length);
        return this
    };
    link.classes.Timer = function(a, c, b, d, e) {
        this.id = a;
        this._initTime = c;
        this._dateTime = Date.now();
        this.time = this._initTime;
        this.callBack = b;
        this.millisec = d || 1E3;
        this.data = e;
        this.timeout = null
    };
    link.classes.Timer.prototype.stop = function() {
        this.timeout && (clearTimeout(this.timeout), this.timeout = null)
    };
    link.classes.Timer.prototype.start = function(a) {
        a && (this.time = this._initTime, this._dateTime = Date.now());
        this.stop();
        this.timeout = setTimeout(function(a) {
            var b = Date.now(),
            d = parseInt(Math.round((b - a._dateTime) / a.millisec));
            a._dateTime = b;
            a.time -= d;
            a.callBack ? a.callBack(a) : a.stop();
            0 <= a.time ? a.start() : (a.stop(), a.time = 0)
        },
        this.millisec, this)
    };
    link.classes.WebSocket = function(a, c, b, d, e) {
        this.ipPort = a || "";
        this.socket = new WebSocket(this.ipPort);
        this.socket.onopen = c;
        this.socket.onmessage = b;
        this.socket.onclose = d;
        this.socket.onerror = e
    };
    link.classes.WebSocket.prototype.send = function(a) {
        this.socket.send(a)
    };
    link.classes.WebSocket.prototype.close = function() {
        this.socket.close()
    };
    link.classes.observer = link.classes.Observer;
    link.classes.timer = link.classes.Timer;
    link.classes.webSocket = link.classes.websocket = link.classes.WebSocket;
    link.commandFuns = link.comm;
    link.commandFuns.collisionCheck = link.commandFuns.collision;
    link.commandFuns.circleCollisionCheck = link.commandFuns.circleCollision;
    link.initImage = link.pushImage
})(); (function(g) {
    var B = function(b, e) {
        return 0 == b && 0 == e ? 0 : 0 < b && 0 > e ? 1 : 0 < b && 0 == e ? 2 : 0 < b && 0 < e ? 3 : 0 == b && 0 < e ? 4 : 0 > b && 0 < e ? 5 : 0 > b && 0 == e ? 6 : 0 > b && 0 > e ? 7 : 0
    };
    link.action = {};
    link.action.Role = function(b, e, n, h, j, p, s, t) {
        this.imageNames = j || [];
        this.rects = p || [];
        this.frames = s || [];
        this.actions = t || [];
        j = this.frames;
        p = this.actions;
        s = [];
        if (0 < p.length) {
            for (t = 0; t < p.length; t++) {
                for (var j = [], b = p[t].frames, w = 0; w < b.length; w++) j.push({
                    args: [b[w][0], b[w][1], b[w][2]],
                    step: b[w][3]
                });
                s.push(new g.action.sprite(j, p[t].loop, 0))
            }
            b = s
        }
        this.sprites = b || [];
        this.x = e || 0;
        this.y = n || 0;
        this.step = this.dy = this.dx = 0;
        this.id = "";
        this.mapOffx = this.x;
        this.mapOffy = this.y;
        this.svy = this.svx = null;
        this._cr = this.current = h || 0;
        this.zoom = 1;
        this.angle = 0;
        this._zooms = [];
        this._angles = [];
        this._moveDs = [4, 7, 5, 5, 6, -5, -5, -7];
        this._stopDs = [0, -3, 1, 1, 2, -1, -1, -3];
        this._path = [];
        e = this.getSprite().getFrame();
        e = this.frames[e.args[0]];
        this._fA = e.fA;
        this.aR = e.aR;
        this.bR = e.bR;
        this._skipMoveDs = !1;
        this.onstart = this.onend = this._stopedAction = null;
        this._locked = !1;
        this.speed = 5
    };
    link.action.Role.prototype.setSprite = function(b, e, n) {
        if (this._locked) return this;
        var h = void 0 != b ? b: 0,
        j = 0 <= h ? g.trans.TRANS_NONE: g.trans.TRANS_MIRROR;
        this._cr != h && (this._cr = h, 0 > h && (h = Math.abs(h)), this.current = h >= this.sprites.length ? this.sprites.length - 1 : h, 1 < this.sprites.length && this.setTrans(j), h = this.getSprite(), j = h.getFrame(), e || h.setFrame(0), n && (this._stopedAction = this._cr), h = this.frames[j.args[0]], this._fA = h.fA, this.aR = h.aR, this.bR = h.bR);
        if (this.links) for (h = 0; j = this.links[h]; h++) j.setSprite(b, e, n);
        trans = null;
        return this
    };
    link.action.Role.prototype.lockSprite = function() {
        this._locked = !0;
        return this
    };
    link.action.Role.prototype.unlockSprite = function() {
        this._locked = !1;
        return this
    };
    link.action.Role.prototype.setTrans = function(b) {
        this.getSprite().trans = b;
        return this
    };
    link.action.Role.prototype.getSprite = function(b) {
        return this.sprites[null == b ? this.current: b]
    };
    link.action.Role.prototype.getFrame = function(b) {
        return this.frames[null == b ? this.getSprite().getFrame().args[0] : b]
    };
    link.action.Role.prototype.action = function() {
        var b = this.getSprite();
        if (!b) return this;
        var e = b.getFrame(),
        g,
        h = 0,
        j = 0;
        if (e) {
            g = this.frames[e.args[0]];
            this._fA = g.fA;
            this.aR = g.aR;
            this.bR = g.bR;
            if (0 < this._path.length) j = this._path.shift(),
            h = j[0] || 0,
            j = j[1] || 0,
            this._skipMoveDs || this.setSprite(this._moveDs[B(h, j)], !0),
            this.svx = h,
            this.svy = j,
            this.mapOffx += this.svx,
            this.mapOffy += this.svy;
            else if (null != this.svx && null != this.svy) {
                this._skipMoveDs || (this.setSprite(this._stopedAction || this._stopDs[B(this.svx, this.svy)]), this._stopedAction = null);
                if (this.onend) this.onend(this);
                this._skipMoveDs = !1;
                this.svy = this.svx = null
            }
            0 < this._zooms.length && (g = this._zooms.shift(), "number" == typeof parseInt(g) && this.setZoom(g));
            0 < this._angles.length && (g = this._angles.shift(), "number" == typeof parseInt(g) && this.setRotate(g));
            this.x += e.args[1] + h;
            this.y += e.args[2] + j
        }
        b.nextFrame();
        return this
    };
    link.action.Role.prototype.render = function() {
        var b = this.getSprite();
        if (b && this._fA) {
            var e = this._fA,
            n = e.length,
            h = g.canvas,
            b = b.trans,
            j, p, s;
            e[0] && (j = this.x, p = this.y, g.canvas.save().translate(j, p).rotate(this.angle * Math.PI / 180).translate( - j, -p));
            for (var t = 0; t < n; t++) j = this.rects[e[t][0]][e[t][1]],
            p = this.imageNames[e[t][0]],
            s = g.getImage(p),
            b == g.trans.TRANS_NONE ? h.drawImage(p, j[0], j[1], j[2], j[3], 1 == this.zoom ? parseInt(this.x + this.dx + e[t][2] * this.zoom) : this.x + this.dx + e[t][2] * this.zoom, 1 == this.zoom ? parseInt(this.y + this.dy + e[t][3] * this.zoom) : this.y + this.dy + e[t][3] * this.zoom, j[2] * this.zoom, j[3] * this.zoom) : 1 == this.zoom ? h.drawRegion(p, j[0], j[1], j[2], j[3], b, parseInt(this.x + this.dx - (e[t][2] + j[2])), parseInt(this.y + this.dy + e[t][3])) : h.drawRegionAndZoom(p, j[0], j[1], j[2], j[3], b, this.x + this.dx - (e[t][2] + j[2]) * this.zoom, this.y + this.dy + e[t][3] * this.zoom, null, j[2] * this.zoom, j[3] * this.zoom),
            !s.loaded && s.bench && h.drawImage(s.bench.id || s.benchId, s.bench.sx || 0, s.bench.sy || 0, s.bench.sw || s.bench.w, s.bench.sh || s.bench.h, parseInt(this.x + this.dx - (s.bench.w * this.zoom >> 1)), parseInt(this.y + this.dy - s.bench.h * this.zoom), s.bench.w * this.zoom, s.bench.h * this.zoom);
            e[0] && g.canvas.restore()
        }
        return this
    };
    link.action.Role.prototype.setZoom = function(b) {
        this.zoom = b;
        return this
    };
    link.action.Role.prototype.setZoomTransition = function(b) {
        b && 0 < b.length && (this._zooms = b);
        return this
    };
    link.action.Role.prototype.endZoomTransition = function() {
        return 0 == this._zooms.length
    };
    link.action.Role.prototype.getBodyRect = function(b, e) {
        var n = this.getSprite(null != b ? Math.abs(b) : null);
        if (!n) return null;
        var h = n.getFrame(e);
        if (!h) return null;
        h = this.frames[h.args[0]].bR;
        return null == b && n.trans != g.trans.TRANS_NONE || 0 > b ? [ - (h[0] + h[2] * this.zoom), h[1] * this.zoom, h[2] * this.zoom, h[3] * this.zoom] : [h[0] * this.zoom, h[1] * this.zoom, h[2] * this.zoom, h[3] * this.zoom]
    };
    link.action.Role.prototype.getAttackRect = function(b, e) {
        var n = this.getSprite(null != b ? Math.abs(b) : null);
        if (!n) return null;
        var h = n.getFrame(e);
        if (!h) return null;
        h = this.frames[h.args[0]].aR;
        return null == b && n.trans != g.trans.TRANS_NONE || 0 > b ? [ - (h[0] + h[2] * this.zoom), h[1] * this.zoom, h[2] * this.zoom, h[3] * this.zoom] : [h[0] * this.zoom, h[1] * this.zoom, h[2] * this.zoom, h[3] * this.zoom]
    };
    link.action.Role.prototype.setStep = function(b) {
        this.step = b || 0;
        for (var e = 0,
        g = this.sprites.length; e < g; e++) this.sprites[e].setStep(b);
        return this
    };
    link.action.Role.prototype.collision = function(b, e, n) {
        if (!b) return ! 1;
        var e = e || "aR",
        n = n || "aR",
        h, j;
        "aR" == e ? h = this.aR: "bR" == e && (h = this.bR);
        "aR" == n ? j = b.aR: "bR" == n && (j = b.bR);
        return h && j ? g.comm.collision(this.getSprite().trans == g.trans.TRANS_NONE ? parseInt(this.x + this.dx + h[0] * this.zoom) : parseInt(this.x + this.dx - (h[0] + h[2]) * this.zoom), parseInt(this.y + this.dy + h[1] * this.zoom), parseInt(h[2] * this.zoom), parseInt(h[3] * this.zoom), b.getSprite().trans == g.trans.TRANS_NONE ? parseInt(b.x + b.dx + j[0] * b.zoom) : parseInt(b.x + b.dx - (j[0] + j[2]) * b.zoom), parseInt(b.y + b.dy + j[1] * b.zoom), parseInt(j[2] * b.zoom), parseInt(j[3] * b.zoom)) : !1
    };
    link.action.Role.prototype.collisionInput = function(b, e, n, h, j) {
        var j = j || "aR",
        p;
        "aR" == j ? p = this.aR: "bR" == j && (p = this.bR);
        return p ? g.comm.collision(this.getSprite().trans == g.trans.TRANS_NONE ? parseInt(this.x + this.dx + p[0] * this.zoom) : parseInt(this.x + this.dx - (p[0] + p[2]) * this.zoom), parseInt(this.y + this.dy + p[1] * this.zoom), parseInt(p[2] * this.zoom), parseInt(p[3] * this.zoom), b, e, n, h) : !1
    };
    link.action.Role.prototype.setLoop = function(b) {
        for (var e = 0,
        g = this.sprites.length; e < g; e++) this.sprites[e].setLoop(b);
        return this
    };
    link.action.Role.prototype.setPath = function(b, e) {
        this._path = b || [];
        if (0 < this._path.length && this.onstart) this.onstart(this);
        e && (this._skipMoveDs = !0);
        return this
    };
    link.action.Role.prototype.concatPath = function(b) {
        this._path = this._path.concat(b || []);
        return this
    };
    link.action.Role.prototype.endPath = function() {
        return 0 == this._path.length
    };
    link.action.Role.prototype.clearPath = function() {
        this._path = [];
        return this
    };
    link.action.Role.prototype.moveTo = function(b, e, n) {
        n && (this.speed = Math.abs(n));
        this.setPath(g.comm.createPath(this.mapOffx, this.mapOffy, b, e, this.speed));
        return this
    };
    link.action.Role.prototype.setMoveDs = function(b) {
        this._moveDs = b || [4, 7, 5, 5, 6, -5, -5, -7];
        return this
    };
    link.action.Role.prototype.setStopDs = function(b) {
        this._stopDs = b || [0, -3, 1, 1, 2, -1, -1, -3];
        return this
    };
    link.action.Role.prototype.mark = function(b, e, g, h) {
        null != b && (this.x = b);
        null != e && (this.y = e);
        null != g && (this.mapOffx = g);
        null != h && (this.mapOffy = h);
        return this
    };
    link.action.Role.prototype.setSpeed = function(b, e) {
        b && (this.speed = Math.abs(b));
        this.nodeXStep = b;
        this.nodeYStep = e;
        return this
    };
    link.action.Role.prototype.setRotate = function(b) {
        this.angle = Math.abs(b) || 0;
        return this
    };
    link.action.Role.prototype.setRotateTransition = function(b) {
        b && 0 < b.length && (this._angles = b);
        return this
    };
    link.action.Role.prototype.endRotateTransition = function() {
        return 0 == this._angles.length
    };
    link.action.Role.prototype.move = function(b, e) {
        null != b && (this.x += b);
        null != e && (this.y += e);
        return this
    };
    link.action.Role.prototype.rotate = function(b) {
        null != b && (this.angle += b);
        return this
    };
    link.action.Role.prototype.stoped = function() {
        return null == this.svx
    };
    link.action.Role.prototype.getCurrent = function() {
        return this.current * (this.getSprite().trans == g.trans.TRANS_NONE ? 1 : -1)
    };
    link.action.Sprite = function(b, e, n, h) {
        this.frames = b || [];
        this.loop = e;
        this.current = n || 0;
        this.step = h || 0;
        this.trans = g.trans.TRANS_NONE;
        this.setFrame(n);
        this.runStep = this.getFrame().step || this.step
    };
    link.action.Sprite.prototype.setFrame = function(b) {
        this.current = b >= this.frames.length ? this.frames.length - 1 : 0 < b ? b: 0;
        this.getFrame().step && (this.runStep = this.getFrame().step);
        return this
    };
    link.action.Sprite.prototype.getFrame = function(b) {
        return this.frames[null == b ? this.current: b]
    };
    link.action.Sprite.prototype.nextFrame = function() {
        if (!this.loop && this.endFrame()) return this;
        0 < this.frames.length && (0 >= this.runStep ? (this.loop ? (this.current++, this.current %= this.frames.length) : this.current < this.frames.length - 1 && this.current++, this.runStep = this.getFrame().step ? this.getFrame().step: this.step) : this.runStep--);
        return this
    };
    link.action.Sprite.prototype.preFrame = function() {
        0 < this.frames.length && (0 >= this.runStep ? (this.loop ? (this.current--, 0 > this.current && (this.current = this.frames.length - 1)) : 0 < this.current && this.current--, this.runStep = this.getFrame().step ? this.getFrame().step: this.step) : this.runStep--);
        return this
    };
    link.action.Sprite.prototype.endFrame = function(b) {
        var e = this.frames.length - 1;
        null != b && (0 <= b && b <= this.frames.length - 1) && (e = b);
        return this.current >= e && 0 == this.runStep
    };
    link.action.Sprite.prototype.firstFrame = function() {
        return 0 == this.current && 0 == this.runStep
    };
    link.action.Sprite.prototype.setStep = function(b) {
        this.step = b || 0;
        this.runStep = this.getFrame().step || this.step;
        return this
    };
    link.action.Sprite.prototype.setLoop = function(b) {
        this.loop = b;
        return this
    };
    var C;
    link.action.Fragment = function(b) {
        this.sprites = b || []
    };
    link.action.Fragment.prototype.queue = function() {
        0 < this.sprites.length ? 0 < this.sprites[0].frames.length && (0 >= this.sprites[0].runStep ? (this.sprites[0].runStep = this.sprites[0].step, C = this.sprites[0].frames.shift(), 0 == this.sprites[0].frames.length && this.sprites.shift()) : (C = this.sprites[0].getFrame(), this.sprites[0].runStep--)) : C = null;
        return C
    };
    g.action.role = g.action.Role;
    g.action.sprite = g.action.Sprite;
    g.action.fragment = g.action.Fragment
})(link); (function(g) {
    var B = navigator.userAgent.toLowerCase(),
    C = !1;
    0 <= B.indexOf("android") && 0 <= B.indexOf("chrome") && (C = !0);
    g.init(320, 550).pushImage([{
        id: "bg1",
        src: "img/bg1.jpg"
    },
    {
        id: "bg2",
        src: "img/bg2.jpg"
    },
    {
        id: "s1",
        src: "img/s1.png"
    }]).asyncImage([{
        id: "s2",
        src: "img/s2.png"
    },
    {
        id: "n1",
        src: "img/number1.png"
    },
    {
        id: "n2",
        src: "img/number2.png"
    }]);
    C || g.initAudio([{
        id: "sound1",
        src: "sound/sound1.mp3",
        loop: !1,
        preload: !0
    }]);
    g.pageLoad(function() {
        var b, e, n, h, j, p, s, t;
        window.scrollTo(0, 1);
        var w, E;
        g.canvas.screen.setHeight(550 < window.innerHeight ? 550 : window.innerHeight);
        w = g.canvas.screen.getWidth();
        E = g.canvas.screen.getHeight();
        _newDate = Date.now();
        var A, D = [];
        A = {
            Button: g.extend(function(b) {
                this.props = g.objExtend({
                    id: "",
                    value: "",
                    x: 0,
                    y: 0,
                    width: 60,
                    height: 30,
                    img: null,
                    color: "#000",
                    strokeColor: "#FFF",
                    bgColor: "",
                    font: "20px \u5fae\u8f6f\u96c5\u9ed1"
                },
                b || {});
                this.collision(0, 0, 0, 0)
            },
            null, {
                collision: function(b, d, e, f, h) {
                    this._released = this._repeated = this._pressed = !1;
                    if (g.comm.collision(b, d, e, f, parseInt(this.props.x), parseInt(this.props.y), parseInt(this.props.width), parseInt(this.props.height))) {
                        switch (h) {
                        case "mousedown":
                        case "touchstart":
                            this._repeated = this._pressed = !0;
                            break;
                        case "mouseup":
                        case "touchend":
                            this._released = !0
                        }
                        g.audio.playRange("sound1", 9, 11)
                    }
                    return this
                },
                pressed: function() {
                    var b = this._pressed;
                    this._pressed = !1;
                    return b
                },
                repeated: function() {
                    return this._repeated
                },
                released: function() {
                    var b = this._released;
                    this._released = !1;
                    return b
                },
                render: function() {
                    this.props.img ? g.canvas.drawImage(this.props.img.id, this.props.img.sx, this.props.img.sy, this.props.img.sw, this.props.img.sh, parseInt(this.props.x), parseInt(this.props.y), parseInt(this.props.width), parseInt(this.props.height)) : "" != this.props.bgColor && g.canvas.fillStyle(this.props.bgColor).fillRect(parseInt(this.props.x), parseInt(this.props.y), parseInt(this.props.width), parseInt(this.props.height));
                    if ("" != this.props.value) {
                        var b = g.canvas.measureText(this.props.value);
                        g.canvas.drawString(this.props.value, parseInt(this.props.x + (this.props.width - b.width >> 1)), parseInt(this.props.y + (this.props.height - b.height >> 1)) + b.height - 2, "", !0, this.props.color, this.props.strokeColor, this.props.font)
                    }
                    return this
                }
            }),
            getButton: function(b) {
                for (var d, e = D.length - 1; 0 <= e; e--) if (d = D[e], d.id == b) return d;
                return null
            },
            appendButton: function(b) {
                var d;
                b && !this.getButton(b.id) && D.push(d = new this.Button(b));
                return d
            },
            removeButton: function(b) {
                for (var d, e = D.length - 1; 0 <= e; e--) if (d = D[e], d.id == b) {
                    D.splice(e, 1);
                    break
                }
                return this
            },
            clearButtons: function() {
                D = [];
                return this
            },
            actionButton: function(b, d, e) {
                for (var f, g = D.length - 1; 0 <= g; g--) f = D[g],
                f.collision(d, e, 1, 1, b);
                return this
            },
            renderButton: function() {
                for (var b, d = D.length - 1; 0 <= d; d--)(b = D[d]) && b.render();
                return this
            }
        };
        var B = g.canvas.screen.getDevice(),
        x = {
            bird: null,
            bgType: 0,
            isGameOver: !1,
            bgColor: "#000",
            bgX: 0,
            bgY: 0,
            bgImgW: 288,
            bgImgH: 512,
            bgWidth: 0,
            bgHeight: 0,
            speed: 0,
            landX: 0,
            landY: 0,
            landW: 672,
            landH: 112,
            g: "android" == B && !C ? 0.7 : 1.5,
            jumpSpeed: "android" == B && !C ? -8 : -12,
            vy: 0,
            obses: [],
            obsDate: null,
            obsTimeout: 1800,
            obsFrameNum: 57,
            obsCurrentFrame: 0,
            obsState: "ready",
            score: 0,
            scoreObsId: "",
            obsMapping: {
                mp1: {
                    id: "s2",
                    sx: 112,
                    sy: 130,
                    width: 52,
                    height: 320
                },
                mp2: {
                    id: "s2",
                    sx: 168,
                    sy: 130,
                    width: 52,
                    height: 320
                },
                mp3: {
                    id: "s2",
                    sx: 0,
                    sy: 130,
                    width: 52,
                    height: 320
                },
                mp4: {
                    id: "s2",
                    sx: 56,
                    sy: 130,
                    width: 52,
                    height: 320
                }
            },
            screenFlush: [],
            birdSpriteId: 0,
            bgId: 1,
            init: function(b, d) {
                this.isGameOver = !1;
                this.bgWidth = 3 * this.bgImgW;
                this.bgHeight = E;
                this.speed = -3;
                this.obses = [];
                this.obsDate = null;
                this.score = 0;
                this.scoreObsId = "";
                this.setBird(this.birdSpriteId, b, d).setBg(this.bgId).landInit();
                null == b && (this.birdSpriteId++, this.birdSpriteId %= 3, this.bgId++, 2 < this.bgId && (this.bgId = 1));
                this.screenFlush = [];
                this.obsCurrentFrame = 0;
                return this
            },
            start: function() {
                this.initObses().birdJump();
                x.bird.state = "flying";
                return this
            },
            setBg: function(b) {
                this.bgType = b;
                switch (this.bgType) {
                default:
                    b = "bg1";
                    this.bgColor = "#4EC0CA";
                    break;
                case 2:
                    b = "bg2",
                    this.bgColor = "#038794"
                }
                g.canvas.pass("bgCache", this.bgWidth, this.bgHeight).drawImage(b, 0, this.bgHeight - this.bgImgH).drawImage(b, this.bgImgW, this.bgHeight - this.bgImgH).pass();
                return this
            },
            bgRender: function() {
                g.canvas.fillStyle(this.bgColor).fillScreen().drawCache("bgCache", this.bgX, this.bgY);
                return this
            },
            gameOver: function() {
                this.screenFade();
                this.isGameOver = !0;
                return this
            },
            screenFade: function() {
                this.isGameOver || (this.screenFlush = [1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0], g.audio.pauseAll().playRange("sound1", 5, 6), window.dp_submitScore && dp_submitScore( - 1, x.score));
                return this
            },
            initObses: function() {
                this.obses = [];
                this.obsDate = Date.now();
                this.obsState = "ready";
                return this
            },
            popObs: function() {
                var b = g.comm.getRandom(60, 170),
                d = this.obsMapping.mp1,
                e = this.obsMapping.mp2;
                this.obses.push({
                    id: g.getNewGuid(),
                    x: w,
                    y: -(d.height - b),
                    width: 52,
                    height: 320,
                    imgObj: d
                });
                this.obses.push({
                    id: g.getNewGuid(),
                    x: w,
                    y: b + 100,
                    width: 52,
                    height: 320,
                    imgObj: e
                });
                return this
            },
            objesAction: function() {
                if (!this.obsDate) return this;
                switch (this.obsState) {
                case "ready":
                    500 <= _newDate - this.obsDate && (this.obsState = "run");
                    break;
                case "run":
                    for (var b = this.obses.length - 1,
                    d; d = this.obses[b]; b--) d.x += this.speed,
                    this.bird.collisionInput(d.x, d.y, d.width, d.height, "bR") && this.gameOver(),
                    -52 >= d.x && this.obses.splice(b, 1);
                    this.obsCurrentFrame++==this.obsFrameNum && (this.obsCurrentFrame = 0, this.obsDate = _newDate, this.popObs())
                }
                if ((b = this.obses[0]) && b.id != this.scoreObsId && b.x < this.bird.x - 26) this.scoreObsId = b.id,
                this.score++;
                return this
            },
            objesRender: function() {
                for (var b, d = 0,
                e; e = this.obses[d]; d++) b = e.imgObj,
                g.canvas.drawImage(b.id, b.sx, b.sy, b.width, b.height, e.x, e.y, b.width, b.height);
                return this
            },
            setBird: function(b, d, e) {
                this.bird || (this.bird = FlappyBird);
                this.bird.mark(d || 88, e || this.bgHeight - 246).setSprite(b).setStep(2).setRotate(0).setLoop(!0).state = "waiting";
                this.vy = 0;
                return this
            },
            birdJump: function() {
                this.isGameOver || (this.vy = this.jumpSpeed, g.audio.playRange("sound1", 0, 1));
                return this
            },
            birdAction: function() {
                if (this.bird) switch (this.bird.action(), this.bird.state) {
                case "waiting":
                    this.bird.endPath() && this.bird.setPath([[0, -1.5], [0, -1.5], [0, -1.5], [0, -1.5], [0, -1.5], [0, -1], [0, -1], [0, -1], [0, -1], [0, -1], [0, 1.5], [0, 1.5], [0, 1.5], [0, 1.5], [0, 1.5], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]], !0);
                    break;
                case "flying":
                    this.vy += this.g;
                    if (this.bird.collisionInput(0, this.bgHeight - this.landH - this.vy, this.landW, this.landH, "bR")) {
                        this.bird.clearPath().setRotate(90).state = "die";
                        this.bird.y = this.bgHeight - this.landH - (this.bird.getBodyRect()[3] >> 1);
                        break
                    }
                    this.bird.y += this.vy;
                    0 > this.bird.y && (this.bird.y = 0);
                    if (0 <= this.vy) {
                        var b = 3 * this.vy;
                        this.bird.setRotate(90 < b ? 90 : b)
                    } else this.bird.setRotate(330);
                    break;
                case "die":
                    this.gameOver(),
                    this.bird.setLoop(!1),
                    this.bird.state = ""
                }
                return this
            },
            birdRender: function() {
                this.bird && this.bird.render();
                return this
            },
            landInit: function() {
                this.landX = 0;
                this.landY = this.bgHeight - this.landH;
                g.canvas.pass("landCache", this.landW, this.landH).drawImage("s1", 0, 0, 336, 112, 0, 0, 336, 112).drawImage("s1", 0, 0, 336, 112, 336, 0, 336, 112).pass();
                return this
            },
            landAction: function() {
                this.landX += this.speed;
                this.landX = this.landX < this.landW - this.bgWidth - this.speed ? 0 : this.landX;
                return this
            },
            landRender: function() {
                g.canvas.drawCache("landCache", this.landX, this.landY);
                return this
            },
            scoreRender: function() {
                g.canvas.drawNumber(this.score, "n1", 24, 36, 0, 50, "center");
                return this
            },
            action: function() {
                _newDate = Date.now();
                this.isGameOver || this.objesAction().landAction();
                this.birdAction();
                return this
            },
            screenFlushRender: function() {
                0 < this.screenFlush.length && (g.canvas.fillStyle("rgba(255, 255, 255, " + this.screenFlush.shift() + ")").fillScreen(), 0 == this.screenFlush.length && (g.audio.playRange("sound1", 7, 8), A.clearButtons(), b = 0, e = -1, (g.localStorage.getItem("FlappyBirdBestScore") || 0) < x.score ? (g.localStorage.setItem("FlappyBirdBestScore", x.score), n = !0) : n = !1, h = parseInt(g.localStorage.getItem("FlappyBirdBestScore") || 0), j = d, p = [ - 3, -2, -1, 1, 2, 3], s = d + 500, t = [ - 200, -100, -70, -40, -20, -10, -5], u = A.appendButton({
                    id: "playBtn",
                    x: f + 40,
                    y: d + 180,
                    width: 112,
                    height: 66,
                    img: {
                        id: "s1",
                        sx: 120,
                        sy: 236,
                        sw: 112,
                        sh: 66
                    }
                }), F = A.appendButton({
                    id: "rankBtn",
                    x: f + 150,
                    y: d + 180,
                    width: 112,
                    height: 66,
                    img: {
                        id: "s1",
                        sx: 240,
                        sy: 236,
                        sw: 112,
                        sh: 66
                    }
                }), g.gameFlow.over()));
                return this
            },
            render: function() {
                this.bgRender().objesRender().birdRender().landRender().scoreRender().screenFlushRender();
                return this
            }
        },
        f = w - 300 >> 1,
        d = E - 240 >> 1,
        u,
        F,
        S = function() {
            x.init();
            A.clearButtons();
            g.gameFlow.zone()
        },
        K = function() {
            g.audio.playRange("sound1", 0, 1);
            x.start();
            A.clearButtons();
            g.gameFlow.run()
        },
        J = {
            values: [],
            opacity: 0,
            callBack: null,
            init: function() {
                this.values = [];
                this.opacity = 0;
                this.callBack = null;
                return this
            },
            fadeIn: function(b) {
                if (0 < this.values.length) return this;
                this.values = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1];
                this.callBack = b;
                return this
            },
            fadeOut: function(b) {
                if (0 < this.values.length) return this;
                this.values = [1, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0];
                this.callBack = b;
                return this
            },
            action: function() {
                0 < this.values.length && (this.opacity = this.values.shift(), 0 == this.values.length && this.callBack && this.callBack());
                return this
            },
            render: function() {
                0 < this.opacity && g.canvas.fillStyle("rgba(0, 0, 0, " + this.opacity + ")").fillScreen();
                return this
            }
        };
        j = 0;
        p = [];
        s = 0;
        t = [];
        b = 0;
        e = -1;
        h = 0;
        n = !1;
        g.run(function() {
            x.action().render();
            J.action().render()
        }).menu(function() {
            x.birdAction().landAction().bgRender().birdRender().landRender();
            g.canvas.drawImage("s1", 118, 182, 178, 48, f + 61, d, 178, 48);
            A.renderButton();
            u && u.released() && J.fadeIn(function() {
                S();
                J.fadeOut()
            });
            F && F.released() && window.dp_Ranking && dp_Ranking();
            J.action().render()
        }).zone(function() {
            x.birdAction().landAction().bgRender().birdRender().landRender().scoreRender();
            g.canvas.drawImage("s1", 2, 118, 192, 58, f + 54, d, 192, 58).drawImage("s1", 0, 182, 114, 98, f + 93, E - 280, 114, 98);
            J.action().render()
        }).over(function() {
            x.birdAction().bgRender().birdRender().landRender();
            g.canvas.drawImage("s1", 202, 118, 200, 50, f + 50, j, 200, 50).drawImage("s2", 2, 2, 234, 122, f + 33, s, 234, 122);
            switch (b) {
            case 0:
                0 < p.length ? j += p.shift() : 0 < t.length ? s += t.shift() : b = 1;
                break;
            case 1:
                e++;
                e >= x.score && (b = 2);
                break;
            case 2:
                A.renderButton(),
                n && g.canvas.drawImage("s2", 224, 486, 32, 14, f + 68, d + 146, 32, 14)
            }
            0 <= e && g.canvas.drawNumber(e, "n2", 14, 20, f + 240, d + 90, !1).drawNumber(h, "n2", 14, 20, f + 240, d + 130, !1);
            u && u.released() && J.fadeIn(function() {
                S();
                J.fadeOut()
            });
            F && F.released() && window.dp_Ranking && dp_Ranking();
            J.action().render()
        }).events.mouseDown(function() {
            x.birdJump()
        }).touchStart(function() {
            x.birdJump()
        }).mouseUp(function(b, d, e) {
            A.actionButton(b.type, d, e, 10, 10);
            g.gameFlow.isIn("zone") && K()
        }).touchEnd(function(b, d, e) {
            window.scrollTo(0, 1);
            A.actionButton(b.type, d, e, 10, 10);
            g.gameFlow.isIn("zone") && K()
        });
        x.init(w >> 1, d + 90);
        A.clearButtons();
        u = A.appendButton({
            id: "playBtn",
            x: f + 40,
            y: d + 180,
            width: 112,
            height: 66,
            img: {
                id: "s1",
                sx: 120,
                sy: 236,
                sw: 112,
                sh: 66
            }
        });
        F = A.appendButton({
            id: "rankBtn",
            x: f + 150,
            y: d + 180,
            width: 112,
            height: 66,
            img: {
                id: "s1",
                sx: 240,
                sy: 236,
                sw: 112,
                sh: 66
            }
        });
        g.gameFlow.menu()
    })
})(link);
var FlappyBird, FlappyBirdNameSpace = {}; (function(g) {
    g.asyncImage([{
        id: "s2",
        src: "img/s2.png"
    }]);
    var B = ["s2"],
    C = [[[230, 142, 34, 24], [230, 194, 34, 24], [230, 246, 34, 24], [230, 298, 34, 24], [230, 350, 34, 24], [174, 466, 34, 24], [118, 466, 34, 24], [62, 466, 34, 24], [6, 466, 34, 24]]],
    b = [{
        aR: [ - 15, -30, 30, 30],
        bR: [ - 16, -15, 32, 31],
        fA: [[0, 5, -16, -11, 0]]
    },
    {
        aR: [ - 15, -30, 30, 30],
        bR: [ - 16, -15, 32, 31],
        fA: [[0, 0, -16, -11, 0]]
    },
    {
        aR: [ - 15, -30, 30, 30],
        bR: [ - 16, -15, 32, 31],
        fA: [[0, 1, -16, -11, 0]]
    },
    {
        aR: [ - 15, -30, 30, 30],
        bR: [ - 16, -16, 32, 32],
        fA: [[0, 2, -16, -11, 0]]
    },
    {
        aR: [ - 15, -30, 30, 30],
        bR: [ - 16, -16, 32, 32],
        fA: [[0, 3, -16, -11, 0]]
    },
    {
        aR: [ - 15, -30, 30, 30],
        bR: [ - 16, -16, 32, 32],
        fA: [[0, 4, -16, -11, 0]]
    },
    {
        aR: [ - 15, -30, 30, 30],
        bR: [ - 16, -16, 32, 32],
        fA: [[0, 8, -16, -11, 0]]
    },
    {
        aR: [ - 15, -30, 30, 30],
        bR: [ - 16, -16, 32, 32],
        fA: [[0, 7, -16, -11, 0]]
    },
    {
        aR: [ - 15, -30, 30, 30],
        bR: [ - 16, -16, 32, 32],
        fA: [[0, 6, -16, -11, 0]]
    }],
    e = [{
        loop: !0,
        frames: [[0, 0, 0, 0], [1, 0, 0, 0], [2, 0, 0, 0], [1, 0, 0, 0]]
    },
    {
        loop: !0,
        frames: [[3, 0, 0, 0], [4, 0, 0, 0], [5, 0, 0, 0], [4, 0, 0, 0]]
    },
    {
        loop: !0,
        frames: [[6, 0, 0, 0], [7, 0, 0, 0], [8, 0, 0, 0], [7, 0, 0, 0]]
    }];
    FlappyBirdNameSpace.get = function(n, h) {
        return new g.action.role([], 0, 0, 0, h ? h: B, C, b, (0 <= n && e[n] ? [e[n]] : e) || e)
    };
    FlappyBird = FlappyBirdNameSpace.get()
})(jsGame);